<?php
/**
 * Klasse für Benutzer
 */
class Model_User extends Zend_Db_Table_Abstract
{
    /** Table name */
    protected $_name = 'user';
	/** Primary Key */
    protected $_primary = 'uid';

    public function createUser($data) {
    	
    	//Der Parameter edittype muss aus den Postdaten entfernt werden, da es kein entsprechendes DB-Feld gibt
    	unset($data['edittype']);
    	//@TODO: Macht es evtl. Sinn, hier ein Array mit erlaubten Feldnamen zu erstellen, über das dann die Postdaten gefiltert werden?
    	
    	//Erstellungsdatum verspeichern
    	$data['created'] = time();
    	$lastinsert_id = parent::insert($data);
    	return $lastinsert_id;
    	
    }
    
	public function updateUser($uid, $data) {
    	
    	//Der Parameter edittype muss aus den Postdaten entfernt werden, da es kein entsprechendes DB-Feld gibt
    	unset($data['edittype']);
    	unset($data['uid']);
    	//@TODO: Macht es evtl. Sinn, hier ein Array mit erlaubten Feldnamen zu erstellen, über das dann die Postdaten gefiltert werden?
    	
    	$rows_updated = $this->update($data, $this->getAdapter()->quoteInto('uid = ?',$uid));
    	return $rows_updated;
    	
    }
    
	public function updateAccount($uid, $data) {
    	
    	//User aus der Session
		$user = Zend_Auth::getInstance()->getIdentity();
    	//Wenn ein anderer User als der aus der Session bearbeitet werden soll: FEHLER!
    	if($user->uid != $uid) return false;
		//Der Parameter edittype muss aus den Postdaten entfernt werden, da es kein entsprechendes DB-Feld gibt
    	unset($data['edittype']);
    	unset($data['uid']);
    	//@TODO: Macht es evtl. Sinn, hier ein Array mit erlaubten Feldnamen zu erstellen, über das dann die Postdaten gefiltert werden?   	
    	
    	//Passwort ändern
    	if(isset($data['change_pw'])) {
    		//Wenn das alte Passwort falsch eingegeben wurde: FEHLER!
    		if(Ht_Password::cryptPassword($data['password_old']) != $user->password) return false;
    		$data['password'] = Ht_Password::cryptPassword($data['password_new']);
    	}
    	unset($data['change_pw']);
    	unset($data['password_old']);
    	unset($data['password_new']);
    	unset($data['password_new_repeat']);
    	
    	$rows_updated = $this->update($data, $this->getAdapter()->quoteInto('uid = ?',$uid));
    	
    	//User in der Session updaten
    	$newUserData = (object) $this->getUserByID($uid);
    	Zend_Auth::getInstance()->getStorage()->write($newUserData);
    	
    	return $rows_updated;
    	
    }
    
	public function getAll($where = null, $order = null, $count = null, $offset = null)
	{
		//Where-Abfrage muss hier leicht modifiziert werden, damit die Rollennamen auch im Array enthalten sind
		$where = $this->select()
        					->from($this)
                         	->from("role")                       
                         	->setIntegrityCheck(false)
                         	->where('role.rid = user.rid');		
    	return $this->fetchAll($where, $order, $count, $offset);
	}
    
	public function getUserByID($uid) {
    	
    	$user = $this->find($uid)->toArray();
		return count($user) == 1 ? $user[0] : false;
    	
    }
    /**
	 * This function is able to take on variable numbers of arguments
     * @param(s) $rids
     * @return array Users
	 */
	public function getUsersByRoleID() {
    	
		$rids = func_get_args();
		
    	//Where-Abfrage muss hier leicht modifiziert werden, damit die Rollennamen auch im Array enthalten sind
		$where = $this->select()
        					->from($this)
                         	->from("role")                       
                         	->setIntegrityCheck(false);
        foreach($rids as $rid) {
        	$where->orWhere('user.rid = ?', $rid);	
        }        
        $where->where('role.rid = user.rid')->group('user.uid');                 		
    	return $this->fetchAll($where, $order, $count, $offset);
    	
    }
	
    public function getClientsByProjectID($pid) {
    	
    	$where = $this->select()
        					->from($this)
                         	->from("rel_projects_user")                       
                         	->setIntegrityCheck(false)
                         	->where('user.uid = rel_projects_user.uid')
                         	->where('user.rid = ?', Model_Role::ROLE_CLIENT)
                         	->where('rel_projects_user.pid = ?', $pid);
    	return $this->fetchAll($where, $order, $count, $offset)->toArray();
    	
    }
    
    public function getUserBillingInformationByID($uid) {
    	
    	$user = $this->getUserByID($uid);
    	if($this->hasSeparateBillingAddress($user)) {
    		
    		$user['company'] = $user['ba_company'];
    		$user['firstname'] = $user['ba_firstname'];
    		$user['lastname'] = $user['ba_lastname'];
    		$user['streetaddress'] = $user['ba_streetaddress'];
    		$user['zipcode'] = $user['ba_zipcode'];
    		$user['city'] = $user['ba_city'];
    		$user['country'] = $user['ba_country'];
    		
    	}
    	
    	return $user;
    	
    }
    /**
	 * This functions tests if any of the billing_address fields has a value.
     * @param array $u  	Userarray
     * @return bool
	 */
    public function hasSeparateBillingAddress($u) {
    	
    	foreach($u as $field => $value) {
    		if(strpos($field, "ba_") !== false) {
    			if($value != "") return true;
    		}
    	}
    	return false;
    	
    }
    
    public function isAllowed($uid, $required_role) {
    	
    	return true;
    	
    }    
	public function login($logindata) {
		
		// Get our authentication adapter and check credentials
        $adapter = $this->_getAuthAdapter();
        $adapter->setIdentity($logindata['username']); 
        $adapter->setCredential($logindata['password']);

        $auth = Zend_Auth::getInstance();
        $result = $auth->authenticate($adapter);
        
        if ($result->isValid()) {
            $user = $adapter->getResultRowObject();
            $auth->getStorage()->write($user);
            return true;
        }
        return false;
        
	}
 	protected function _getAuthAdapter() {
        
        $dbAdapter = Zend_Db_Table::getDefaultAdapter();
        $authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
        
        $authAdapter->setTableName('user')
            ->setIdentityColumn('mail')
            ->setCredentialColumn('password')
            //->setCredentialTreatment('SHA1(CONCAT(?,salt))');
            ->setCredentialTreatment('SHA1(?)');
        
        return $authAdapter;
    }
};

?>